package pl.edu.pw.elka.tinyrepo.dataserver.server;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;

import pl.edu.pw.elka.tinyrepo.common.HTTPHeaderType;
import pl.edu.pw.elka.tinyrepo.common.RequestHandler;
import pl.edu.pw.elka.tinyrepo.common.Response;
import pl.edu.pw.elka.tinyrepo.common.StatusCode;
import pl.edu.pw.elka.tinyrepo.gate.server.GateFacade;

/**
 * Request handler dla metody DELETE.
 * 1. Serwer sprawdza czy plik istnieje na dysku
 * 2a. Jeśli tak to go usuwa i wysyła response OK
 * 2b. Jeśli nie to wysyła Response NOT_FOUND.
 * 3. Jeśli usunął plik to wywołuje odpowiednią metodę gate (jeszcze nie wiem jaką)
 * 
 * TODO: Co jeśli pliku nie można usunąć, bo np. jest aktualnie używany? Na razie zwracam kod CONFLICT
 * 
 * @author Dominik Olędzki
 */

public class DELETERequestHandler extends DataServerRequestHandler {

	private File requestedFile = null;
	
	public DELETERequestHandler(File dataCatalog, GateFacade gate) {
		this.dataCatalog = dataCatalog;
		this.gate = gate;
	}
	
	@Override
	public RequestHandler copy() {
		return new DELETERequestHandler(dataCatalog, gate);
	}

	@Override
	public void run() {
		OutputStream out = null;
		try {
			//Sprawdzamy czy zapytanie jest poprawne
			if (incomming == null || request == null || dataCatalog == null)
				throw new RuntimeException("DATA SRV: impl problem");

			out = incomming.getOutputStream();
			Response r;
			requestedFile = new File(dataCatalog, request.getPath());
			//Sprawdzamy czy zapytanie wskazuje na plik i czy plik istnieje
			if (requestedFile.exists() == true && requestedFile.isFile() == true) {
            String requestedFileName = request
            .getHeader(HTTPHeaderType.LOCATION);
            if(requestedFileName == null) { // brak LOCATION
               r = new Response(StatusCode.BAD_REQUEST);
               r.write(out);
               return;
            }
				//Sprawdzamy czy mamy prawa zapisu do pliku
				if (requestedFile.canWrite()) {
					requestedFile.delete();
					r = new Response(StatusCode.OK);
					gate.dropFile(requestedFileName);
					System.out.println("Dropped file from repo: " + requestedFileName);
				} else {
					//Nie ma praw zapisu, nie można usunąć pliku
					r = new Response(StatusCode.CONFLICT);
					System.err.println("Trying to drop a file, which is currently used or this is not file");
				}
			} else {
				r = new Response(StatusCode.NOT_FOUND);
			}
			r.write(out);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}	
}
